function async(arg, callback){
    console.log('参数为'+arg+',1秒后的返回结果')
    setTimeout(()=>{callback(arg*2);},1000)
}

function final(value){
    console.log('完成：',value)
}

//// 回调函数实现异步流程的控制
// async(1,value=>{
//     async(value,value=>{
//         async(value,value=>{
//             async(value,value=>{
//                 async(value,value=>{
//                     async(value,final)
//                 })
//             })
//         })
//     })
// })



var items = [1,2,3,4,5,6]
var results=[]
//// 串行执行
// function series(item){
//     if(item){
//         async(item,result=>{
//             results.push(result)
//             return series(items.shift())
//         })
//     }else{
//         return final(results[results.length-1])
//     }
// }
// series(items.shift())


//// 并行执行
// items.forEach(item=>{
//     async(item, result=>{
//         results.push(result)
//         if(results.length === items.length){
//             final(results[results.length - 1])
//         }
//     })
// })


//并行与串行的结合
var running = 0
var limit = 2

function launcher(){
    while(running < limit && items.length > 0){
        var item = items.shift()
        async(item, result=>{
            results.push(result)
            running--
            if(items.length>0){
                launcher()
            }else if(running == 0){
                final(results)
            }
        })
        running ++
    }
}

launcher()